from typing import List

from redis import Redis

from .nodes.mcp import MCPNodes
from ..graph.base import BaseGraph
from ..graph.nodes import *
from ..mcps import MCPClientManager
from ..models.graph import GraphRequest
from ..parser.xml_parser import XmlToolResultParser


class ChatGraph(BaseGraph):
    """
    一个专业的AI智能助手，专注于日常对话和知识问答。
    擅长回答各种问题、提供建议、进行学术讨论、创意写作等，
    适用于不需要文件操作、命令执行等工具功能的对话场景。
    能够进行深入的思考和分析，为用户提供准确、有用的信息和建议。

    系统会根据用户输入的问题自动分析并设置以下参数：
    - title (必选): 基于用户问题生成的标题，能概括问题的核心内容或意图，控制在20个字以内。
        - 对于日常问候类的对话，也需要生成一个合适的标题，如"日常问候与交流"
        - 标题应该清晰反映用户的意图或需求，便于后续追踪和管理
        - 标题生成是必需的，不可省略
    """

    def __init__(self,
                 redis: Redis = None,
                 nodes: List[BaseNodes] = [],
                 graph_name="agent_chat_",
                 agent_template: str = "agent_chat",
                 mcp_client: MCPClientManager = None,
                 **kwargs):
        super().__init__(graph_name=graph_name,
                         agent_template=agent_template,
                         redis=redis,
                         **kwargs)
        self.nodes = nodes if nodes else [CompletionNodes()]
        self.parser = XmlToolResultParser(tools=self.get_nodes_schema())
        if mcp_client:
            self.nodes.append(MCPNodes(mcp_client).use_mcp_tool)

    async def get_system_template(self, request: GraphRequest, state=None, template_type: str = None):
        """
        Override base implementation to add coder-specific default values.
        """
        if "custom_instructions" not in request.kwargs:
            request.kwargs["custom_instructions"] = ""

        return await super().get_system_template(request=request, state=state, template_type=template_type)
